#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<assert.h>

static void showPending(sigset_t &pending)
{
    for(int sig = 1; sig <= 31; sig++)
    {
        if(sigismember(&pending,sig)) 
            std::cout << "1";
        else 
            std::cout << "0";
    }
    std::cout << std::endl;
}

static void handler(int signum)
{
    std::cout << "捕捉 信号: " << signum << std::endl;
    //不要终止进程(exit)
}

static void blockSig(int sig)
{
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset,sig);
    int n = sigprocmask(SIG_BLOCK,&bset,nullptr);
    assert(n == 0);
    (void)n;
}

int main()
{
    for(int sig = 1; sig <= 31; ++sig)
    {
        blockSig(sig);
    }
    sigset_t pending;
    while(true)
    {
        sigpending(&pending);
        showPending(pending);
        sleep(1);
    }

    // //0.方便测试，捕捉2号信号，不要退出
    // signal(2,handler);
    // //1.定义信号集对象
    // sigset_t bset,obset;
    // sigset_t pending;
    // //2.初始化
    // sigemptyset(&bset);
    // sigemptyset(&obset);
    // sigemptyset(&pending);
    // //3.添加要进行冰壁的信号
    // sigaddset(&bset,2 /*SIGINT*/);
    // //4.设置set到内核中对应的进程内部[默认情况进程不会对任何信号进行block]
    // int n = sigprocmask(SIG_BLOCK,&bset,&obset);
    // assert(n == 0);
    // (void)n;

    // std::cout << "block 2 号信号成功...,pid: " << getpid() << std::endl;
    // //5.重复打印当前进程的pending信号集
    // int count = 0;
    // while(true)
    // {
    //     //5.1获取当前进程的pending信号集
    //     sigpending(&pending);
    //     //5.2显示pending信号机制的没有被递达的信号
    //     showPending(pending);
    //     sleep(1); 
    //     count++;
    //     if(count == 20)
    //     {
    //         //默认情况下，恢复对于2号信号的block的时候，确实会进行递达
    //         //但是2号信号的默认处理的动作是终止进程
    //         //需要对2号信号进行捕捉
    //         std::cout << "解除对于2号信号的block" << std:: endl;
    //         int n = sigprocmask(SIG_SETMASK,&obset,nullptr);
    //         assert(n == 0);
    //         (void)n;
    //     }
    // }
   
    return 0;
}











// void catchSig(int signum)
// {
//     std::cout << "获得了一个信号：" << signum << std::endl;

//     //exit(0);
//     //switch(signum)
//     // {
//     //     case SIGINT:
//     //     break;
//     //     case SIGQUIT:
//     //     break;
//     // }
// }

// int main()
// {
//     for(int i = 1; i <= 31; i++) 
//         signal(i,catchSig);
//     while(true) sleep(1);

//     //signal(2,handler);
//     // signal(2,SIG_IGN);
//     // signal(2,SIG_DFL);
// }
